﻿using QuanLyGiaoVuDAL.DTO;
using QuanLyGiaoVuDAL.Repositories.DatabaseRepositories;
using QuanLyGiaoVuService.CommonServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuanLyGiaoVuService.CommandServices
{
    public class TaiLieuCommandService : ITaiLieuCommandService
    {
        private ITaiLieuRepository _taiLieuRepository;
        private IFileRepository _fileRepository;
        private IFileService _fileService;
        private IQuanLyQuyenTruyCapService _quyenTruyCapService;

        public TaiLieuCommandService(ITaiLieuRepository taiLieuRepository, IQuanLyQuyenTruyCapService quyenTruyCapService, IFileService fileService)
        {
            _taiLieuRepository = taiLieuRepository;
            _quyenTruyCapService = quyenTruyCapService;
            _fileService = fileService;
        }

         public TaiLieuDTO InsertTaiLieu(Guid maNguoiDung, TaiLieuDTO taiLieu)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiDung) || _quyenTruyCapService.KiemTraQuyenTrenThuMuc(maNguoiDung, taiLieu.MaThuMuc))
            {
                if (taiLieu.MaTaiLieu.Equals(Guid.Empty))
                    taiLieu.MaTaiLieu = Guid.NewGuid();
                return _taiLieuRepository.InsertTaiLieu(taiLieu);
            }
            else
                throw new AccessViolationException("Không có quyền tạo tài liệu trong thư mục này.");
        }

        public TaiLieuDTO UpdateTaiLieu(Guid maNguoiDung, TaiLieuDTO taiLieu)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiDung) || _quyenTruyCapService.KiemTraQuyenTrenTaiLieu(maNguoiDung, taiLieu.MaTaiLieu))
                return _taiLieuRepository.UpdateTaiLieu(taiLieu);
            else
                throw new AccessViolationException("Không có quyền cập nhật tài liệu.");
        }

        public bool DeleteTaiLieu(Guid maNguoiDung, Guid maTaiLieu)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiDung) || _quyenTruyCapService.KiemTraQuyenTrenTaiLieu(maNguoiDung, maTaiLieu))
                return _taiLieuRepository.DeleteTaiLieu(maTaiLieu);
            else
                throw new AccessViolationException("Không có quyền xóa tài liệu.");
        }

        public ThuMucDTO TaoThuMucMoi(Guid maNguoiDung, ThuMucDTO thuMuc)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiDung) || ((thuMuc.MaThuMucCha != null) && _quyenTruyCapService.KiemTraQuyenTrenThuMuc(maNguoiDung, (Guid)thuMuc.MaThuMucCha)))
            {
                if (thuMuc.MaThuMuc.Equals(Guid.Empty))
                    thuMuc.MaThuMuc = Guid.NewGuid();
                ThuMucDTO thuMucMoi = _taiLieuRepository.TaoThuMucMoi(thuMuc);
                _quyenTruyCapService.ThietLapQuyen(maNguoiDung, thuMucMoi.MaThuMuc);
                return thuMucMoi;
            }
            else
                throw new AccessViolationException("Không có quyền tạo thư mục mới.");

        }

        public ThuMucDTO SuaThuMuc(Guid maNguoiDung, ThuMucDTO thuMuc)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiDung) || ((thuMuc.MaThuMucCha != null) && _quyenTruyCapService.KiemTraQuyenTrenThuMuc(maNguoiDung, (Guid)thuMuc.MaThuMucCha)))
                return _taiLieuRepository.SuaThuMuc(thuMuc);
            else
                throw new AccessViolationException("Không có quyền sửa thư mục");
        }

        public bool XoaThuMuc(Guid maNguoiDung, Guid id)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiDung) || (_quyenTruyCapService.KiemTraQuyenTrenThuMuc(maNguoiDung, id)))
            {
                IEnumerable<ThuMucDTO> dsThuMucCon = _taiLieuRepository.GetThuMucConByMaThuMucCha(id);
                IEnumerable<TaiLieuDTO> dsTaiLieu = _taiLieuRepository.GetAllTaiLieu(id, null, null, null, null);
                if (dsThuMucCon.Count() > 0 || dsTaiLieu.Count() > 0)
                    throw new Exception("Không thể xóa thư mục. Chỉ có thể xóa thư mục rỗng.");
                return _taiLieuRepository.XoaThuMuc(id);
            }
            else
                throw new AccessViolationException("Không có quyền xóa thư mục.");
        }


        public bool ChiaSeTaiLieu(Guid maTaiLieu, bool chiaSe)
        {
            var taiLieu = _taiLieuRepository.GetTaiLieuById(maTaiLieu);
            if (taiLieu != null)
            {
                taiLieu.ChiaSe = chiaSe;
                _taiLieuRepository.UpdateTaiLieu(taiLieu);
                return true;
            }
            else return false;
        }


        public ThuMucDTO TaoThuMucGiangVien(Guid maNguoiTao, Guid maGiangVien, ThuMucDTO thuMuc)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiTao) || ((thuMuc.MaThuMucCha != null) && _quyenTruyCapService.KiemTraQuyenTrenThuMuc(maNguoiTao, (Guid)thuMuc.MaThuMucCha)))
            {
                if (thuMuc.MaThuMuc.Equals(Guid.Empty))
                {
                        thuMuc.MaThuMuc = Guid.NewGuid();
                }
                ThuMucDTO thuMucMoi = _taiLieuRepository.TaoThuMucMoi(thuMuc);
                _quyenTruyCapService.ThietLapQuyen(maGiangVien, thuMucMoi.MaThuMuc);
                return thuMucMoi;
            }
            else
                throw new AccessViolationException("Không có quyền tạo thư mục mới.");
        }

        public ThuMucDTO TaoThuMucGocGiangVien(Guid maNguoiTao, Guid maGiangVien, ThuMucDTO thuMuc)
        {
            if (_quyenTruyCapService.LaAdmin(maNguoiTao) || ((thuMuc.MaThuMucCha != null) && _quyenTruyCapService.KiemTraQuyenTrenThuMuc(maNguoiTao, (Guid)thuMuc.MaThuMucCha)))
            {
                if (thuMuc.MaThuMuc.Equals(Guid.Empty))
                {
                    thuMuc.MaThuMuc = maGiangVien;
                }
                ThuMucDTO thuMucMoi = _taiLieuRepository.TaoThuMucMoi(thuMuc);
                _quyenTruyCapService.ThietLapQuyen(maGiangVien, thuMucMoi.MaThuMuc);
                return thuMucMoi;
            }
            else
                throw new AccessViolationException("Không có quyền tạo thư mục mới.");
        }


        public bool SaoChepTaiLieu(Guid maTaiLieu, Guid maThuMuc)
        {
            bool success = false;
            TaiLieuDTO taiLieu = _taiLieuRepository.GetTaiLieuById(maTaiLieu);
            var fileId = _fileService.CopyFile(taiLieu.MaTapTin);
            if (fileId != Guid.Empty)
            {
                taiLieu.MaTaiLieu = Guid.NewGuid();
                taiLieu.MaThuMuc = maThuMuc;
                taiLieu.MaTapTin = fileId;
                _taiLieuRepository.InsertTaiLieu(taiLieu);
                success = true;
            }
            return success;
        }
    }
}
